package ui;

import config.ConfigFactory;
import config.GameConfig;
import config.LayerConfig;
import control.GameControl;
import control.PlayerControl;
import dto.GameDto;
import service.GameService;

import javax.swing.*;
import java.awt.*;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;

public class JPanelGame extends JPanel {
    private  ArrayList<Layer> layers = null;
    private  GameDto dto = null;
    public JPanelGame(GameDto dto) {

        //获得dto对象
        this.dto = dto;
        //初始化组件
        initComponent();
        //初始化层
        initLay();

    }

    /**
     * 安装玩家控制器
     * @param control
     */
    public void setGameControl(PlayerControl control) {
        this.addKeyListener(control);
    }

    /**
     * 初始化组件
     */
    private void initComponent() {
    }


    /**
     * 层初始化
     */
    private void initLay() {
        try {
            //获取游戏配置
            GameConfig cfg = ConfigFactory.getGameConfig();
            //获取游戏图审层配置
            List<LayerConfig> layersCfg = cfg.getLayersConfig();
            //创建游戏层数组
            layers = new ArrayList <Layer>(layersCfg.size());
            //创建所有层对象
            for (LayerConfig layerCfg : layersCfg) {
                //通过字符串创建对哦（反射） 获取对象
                Class<?> cls = Class.forName(layerCfg.getClassName());
                //获取构造函数
                Constructor ctr  = cls.getConstructor(int.class,int.class,int.class,int.class);
                //调用构造函数
                Layer layer =  (Layer) ctr.newInstance(
                        layerCfg.getX(),layerCfg.getY(),layerCfg.getW(),layerCfg.getH()
                );
                layer.setDto(this.dto);//设置游戏对象
                layers.add(layer);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void paintComponent(Graphics g) {
        //调用基类方法
        super.paintComponent(g);
        //绘制游戏界面
        for (int i=0; i < layers.size();layers.get(i++).paint(g));
        //返回焦点
        this.requestFocus();
    }



}
